package com.atguigu.gmall.order.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.UserAuthUtils;
import com.atguigu.gmall.order.biz.OrderBizService;
import com.atguigu.gmall.order.entity.OrderDetail;
import com.atguigu.gmall.order.entity.OrderInfo;
import com.atguigu.gmall.order.service.OrderDetailService;
import com.atguigu.gmall.order.service.OrderInfoService;
import com.atguigu.gmall.order.vo.OrderSubmitVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @author lfy
 * @Description
 * @create 2022-10-19 14:30
 */
@RequestMapping("/api/order/auth")
@RestController
public class OrderRestController {


    @Autowired
    OrderBizService orderBizService;

    @Autowired
    OrderInfoService orderInfoService;
    @Autowired
    OrderDetailService orderDetailService;

    /**
     * 获取订单列表数据
     * @return
     */
    @GetMapping("/{page}/{limit}")
    public Result orderList(@PathVariable("page") Long page,
                            @PathVariable("limit") Long limit){

        //订单、订单项？ 连表查询
        Long userId = UserAuthUtils.getUserAuthInfo().getUserId();
        Page<OrderInfo> objectPage = new Page<OrderInfo>(page, limit);
        Page<OrderInfo> result = orderInfoService.page(objectPage, new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getUserId, userId));

        //分页得到的所有数据结果
        result.getRecords().stream()
                .forEach(item -> {
                    List<OrderDetail> orderDetails = orderDetailService.getOrderDetails(item.getId(), item.getUserId());
                    item.setOrderDetailList(orderDetails);
                });

//        List<OrderInfo> infos = orderInfoService.getOrderAndDetail(page,limit);

        return Result.ok(result);
    }

    /**
     * 订单提交
     *
     * 基本数据校验：【合法性校验】
     *   前端会发请求给后台，后台会收到一堆数据，、
     *   后台会要求前端传来的数据符合一定规则（邮箱、年龄、生日、用户名）才是有效数据。
     *   否则后台应该拒收，并给前端响应数据格式有问题，要求前端必须重新传递
     *
     * https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#validation
     *
     * 永远不要相信前端带来的数据，核心数据必须校验
     *  （基本校验 + 业务校验）
     *
     *  业务校验： 根据业务的特殊性，对核心字段进行校验
     *      注册-用户名：校验用户名是否重复
     *      身份号：查验算法
     *      邮箱地址：发验证码....
     *
     *
     *
     * @Valid 标注的字段校验通过，才能继续走后续的逻辑。否则直接抛校验异常，由全局异常捕获
     *
     * @return
     */
    @PostMapping("/submitOrder")
    public Result submitOrder(@Valid @RequestBody OrderSubmitVo submitVo,
                              @RequestParam("tradeNo") String tradeNo){


        Long orderId = orderBizService.submitOrder(submitVo,tradeNo);
        //前端显示不了Long大数字，需要转字符串
        return Result.ok(orderId.toString());
    }
}
